package map;

import java.util.*;
import java.util.function.Consumer;

/**
 * Map的遍历
 * Map支持三种遍历方式
 * 1:遍历所有的key
 * 2:遍历每一组键值对
 * 3:遍历所有的value(相对不常用)
 */
public class MapDemo2 {
    public static void main(String[] args) {
//        Map<String,Integer> map = new HashMap<>();
        //如果希望使用散列表，并且put与遍历顺序一致，可以使用LinkedHashMap
        Map<String,Integer> map = new LinkedHashMap<>();
        map.put("语文",99);
        map.put("数学",100);
        map.put("英语",98);
        map.put("物理",97);
        map.put("化学",99);
        System.out.println(map);
        /*
            遍历所有的key
            Set<K> keySet()
            将当前Map中所有的key以一个Set集合形式返回
         */
        Set<String> keySet = map.keySet();
        for(String key : keySet){
            System.out.println("key:"+key);
        }

        /*
            entry:条目
            遍历每一组键值对
            Set<Map.Entry<K,V>> entrySet()
            将当前Map中所有的键值对以一个Set集合形式返回

            Entry是Map定义的一个接口，它的实例用于表示Map中的一组键值对
            其中有两个方法:
            K getKey()   : 获取键值对中的key
            V getValue() : 获取键值对中的value
         */
        Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
        for (Map.Entry<String,Integer> entry : entrySet){
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key+":"+value);
        }

        /*
            遍历所有的value
            Collection<V> values()
            将当前Map中所有的value以一个Collection集合形式返回
         */
        Collection<Integer> values = map.values();
        for(Integer value : values){
            System.out.println("value:"+value);
        }

        /*
            JDK8之后，集合和Map都提供了基于lambda表达式的遍历:forEach()方法
         */
        Collection<String> c = new ArrayList<>();
        c.add("one");
        c.add("two");
        c.add("three");
        c.add("four");
        c.add("five");
        /*
            Consumer:消费者
            Consumer是一个接口，里面有一个抽象方法:accept，该方法的作用就是
                    消费掉accept方法传入的参数
            结合到集合的forEach方法，作用是，集合会陆续的将每个元素通过调用
            Consumer的accept方法传入，并让其使用，具体对元素如何使用那取决于
            accept方法的实现了
         */
//        c.forEach(new Consumer<String>() {
//            @Override
//            public void accept(String s) {
//                System.out.println(s);
//            }
//        });
//        c.forEach((s)->System.out.println(s));//lambda表达式写法
        c.forEach(System.out::println);//方法引用写法

        /*
            Map的forEach
         */
        map.forEach((k,v)->System.out.println(k+":"+v));


    }
}



